package com.itheima.security;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.pojo.SysUser;
import com.itheima.service.UserService;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 目标： 为了给安全框架提供用户信息
 *     必须实现：UserDetailsService接口
 *
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Component
public class SpringSecurityUserService implements UserDetailsService {


    @Reference
    UserService userService;


    /**
     * 根据用户名载入用户信息
     *  1. 根据用户输入的用户名从数据库查询用户（SysUser）信息
     *  2. 创建一个安全框架能识别 User（UserDetails）对象返回
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //1. 根据用户输入的用户名从数据库查询用户（SysUser）信息
        //注意：该用户包含了对应的权限信息
        SysUser sysUser = userService.findByUsername(username);
        if (sysUser != null) {
            //2. 创建一个安全框架能识别 User（UserDetails）对象返回
            /**
             * 参数1:用户名
             * 参数2：密码
             * 参数3： 权限列表
             */
            //创建权限列表对象
            Collection<GrantedAuthority> list = new ArrayList<>();
            //循环所有的角色， 角色中包含了多个权限
            for (Role role : sysUser.getRoles()) {
                //循环每一个角色所有的权限
                for (Permission permission : role.getPermissions()) {
                    //创建权限  SimpleGrantedAuthority 是GrantedAuthority 实现类
                    SimpleGrantedAuthority grantedAuthority = new SimpleGrantedAuthority(permission.getKeyword());
                    //添加权限集合中
                    list.add(grantedAuthority);
                }
            }
            User user = new User(sysUser.getUsername(),sysUser.getPassword(),list);
            return  user;
        }
        return  null;
    }
}
